﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Framework.Entidade.Acesso;
using Framework.LogicaNegocio.Acesso;
using Framework.Util;
using Framework.Util.Enumerador;

namespace Web
{
    public partial class ConfigurarGrupo : System.Web.UI.Page
    {
        #region Propriedades

        public int IdGrupo
        {
            get
            {
                if (ViewState["IdGrupo"] == null)
                    ViewState["IdGrupo"] = 0;

                return Convert.ToInt32(ViewState["IdGrupo"]);
            }
            set { ViewState["IdGrupo"] = value; }
        }

        public List<EN_Funcionalidade> FuncionalidadesDisponiveis
        {
            get
            {
                if (ViewState["FuncionalidadesDisponiveis"] == null)
                    ViewState["FuncionalidadesDisponiveis"] = new List<EN_Funcionalidade>();

                return (List<EN_Funcionalidade>)ViewState["FuncionalidadesDisponiveis"];
            }
            set { ViewState["FuncionalidadesDisponiveis"] = value; }
        }

        public List<EN_Funcionalidade> FuncionalidadesAssociadas
        {
            get
            {
                if (ViewState["FuncionalidadesAssociadas"] == null)
                    ViewState["FuncionalidadesAssociadas"] = new List<EN_Funcionalidade>();

                return (List<EN_Funcionalidade>)ViewState["FuncionalidadesAssociadas"];
            }
            set { ViewState["FuncionalidadesAssociadas"] = value; }
        }

        #endregion

        #region Métodos

        private void ExibirMensagem(string mensagem, TipoMensagemEnum tipoMensagem)
        {
            ucMensagem.Mensagem = mensagem;
            ucMensagem.TipoMensagem = tipoMensagem;
            ucMensagem.ExibirMensagem();
        }

        private void IniciarTela()
        {
            EN_Grupo objGrupo = new EN_Grupo();
            LN_Grupo objGrupoLN = new LN_Grupo();

            try
            {
                ucCabecalho.TelaDestino = "~/Admin/Acesso/ConfigurarGrupo.aspx";
                ucCabecalho.CarregarCabecalho();

                objGrupo = objGrupoLN.RetornarGrupo(IdGrupo);

                if (objGrupo != null)
                    lblNomeGrupo.Text = objGrupo.Nome;

                FuncionalidadesAssociadas = RetornarFuncionalidadesAssociadas();
                FuncionalidadesDisponiveis = RetornarFuncionalidadesDisponiveis();
                CarregarListBox();
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private List<EN_Funcionalidade> RetornarFuncionalidadesAssociadas()
        {
            List<EN_Funcionalidade> lstFuncionalidades = new List<EN_Funcionalidade>();
            LN_Funcionalidade objFuncionalidadeLN = new LN_Funcionalidade();

            try
            {
                lstFuncionalidades = objFuncionalidadeLN.ListarFuncionalidadePorGrupo(IdGrupo, StatusEnum.A.ToString());
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }

            return lstFuncionalidades;
        }

        private List<EN_Funcionalidade> RetornarFuncionalidadesDisponiveis()
        {
            LN_Funcionalidade objFuncionalidadeLN = new LN_Funcionalidade();
            List<EN_Funcionalidade> lstFuncionalidades = new List<EN_Funcionalidade>();
            List<EN_Funcionalidade> lstFuncionalidadesDisp = new List<EN_Funcionalidade>();

            try
            {
                lstFuncionalidades = objFuncionalidadeLN.Listar(0, string.Empty, StatusEnum.A.ToString());

                if (FuncionalidadesAssociadas != null)
                {
                    bool associada;

                    foreach (EN_Funcionalidade objFuncionalidade in lstFuncionalidades)
                    {
                        associada = false;

                        foreach (EN_Funcionalidade objFuncAssociada in FuncionalidadesAssociadas)
                        {
                            if (objFuncionalidade == objFuncAssociada)
                                associada = true;
                        }

                        if (associada == false)
                            lstFuncionalidadesDisp.Add(objFuncionalidade);
                    }
                }
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }

            return lstFuncionalidadesDisp;
        }

        private void CarregarListBox()
        {
            try
            {
                foreach (EN_Funcionalidade objFuncAssociadas in FuncionalidadesAssociadas)
                {
                    ListItem item = new ListItem();
                    item.Value = objFuncAssociadas.Id.ToString();

                    if (objFuncAssociadas.FuncionalidadePai.Id > 0)
                    {
                        if (objFuncAssociadas.FuncionalidadePai.FuncionalidadePai.Id > 0)
                            item.Text = string.Concat("[", objFuncAssociadas.Tipo, "]", " | ", objFuncAssociadas.FuncionalidadePai.FuncionalidadePai.Titulo, " | "
                                , objFuncAssociadas.FuncionalidadePai.Titulo, " | ", objFuncAssociadas.Titulo);
                        else
                            item.Text = string.Concat("[", objFuncAssociadas.Tipo, "]", " | ", objFuncAssociadas.FuncionalidadePai.Titulo, " | ", objFuncAssociadas.Titulo);
                    }
                    else
                        item.Text = string.Concat("[", objFuncAssociadas.Tipo, "]", " | ", objFuncAssociadas.Titulo);

                    ltbAssociadas.Items.Add(item);
                }
                ltbAssociadas.DataBind();

                foreach (EN_Funcionalidade objFuncDisponiveis in FuncionalidadesDisponiveis)
                {
                    ListItem item = new ListItem();
                    item.Value = objFuncDisponiveis.Id.ToString();

                    if (objFuncDisponiveis.FuncionalidadePai.Id > 0)
                    {
                        if (objFuncDisponiveis.FuncionalidadePai.FuncionalidadePai.Id > 0)
                            item.Text = string.Concat("[", objFuncDisponiveis.Tipo, "]", " | ", objFuncDisponiveis.FuncionalidadePai.FuncionalidadePai.Titulo, " | "
                                , objFuncDisponiveis.FuncionalidadePai.Titulo, " | ", objFuncDisponiveis.Titulo);
                        else
                            item.Text = string.Concat("[", objFuncDisponiveis.Tipo, "]", " | ", objFuncDisponiveis.FuncionalidadePai.Titulo, " | ", objFuncDisponiveis.Titulo);
                    }
                    else
                        item.Text = string.Concat("[", objFuncDisponiveis.Tipo, "]", " | ", objFuncDisponiveis.Titulo);

                    ltbDisponiveis.Items.Add(item);
                }
                ltbDisponiveis.DataBind();
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        #endregion

        #region Eventos

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == true) return;

            if (Context.Items["IdGrupo"] != null)
                IdGrupo = Convert.ToInt32(Context.Items["IdGrupo"].ToString());

            IniciarTela();
        }

        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            IniciarTela();
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {

        }

        protected void btiAssocTodos_Click(object sender, ImageClickEventArgs e)
        {

        }

        protected void btiAssociar_Click(object sender, ImageClickEventArgs e)
        {

        }

        protected void btiDesassociar_Click(object sender, ImageClickEventArgs e)
        {

        }

        protected void btiDesTodos_Click(object sender, ImageClickEventArgs e)
        {

        }

        #endregion
    }
}